Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ


Displaying Raw β€’ Download

feature/firmware/src/commonMain/kotlin/org/meshtastic/feature/firmware/FirmwareFileHandler.kt 2d20cd8a4708e2ef66e98d5259f3a97ec93f240a (2d20cd8a) Text, 13.37 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.firmware

Tff7b72import T7ee787org.meshtastic.core.common.util.CommonUri
Tff7b72import T7ee787org.meshtastic.core.model.DeviceHardware

T8b949e/**
* Abstraction over platform file and network I/O required by the firmware update pipeline. Implementations live in
* `androidMain` and `jvmMain`.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72interface T56d364FirmwareFileHandler Tb4b4b4{

T8b949e// ── Lifecycle / cleanup ──────────────────────────────────────────────

T8b949e/** Remove all temporary firmware files created during previous update sessions. */
Tff7b72fun Td2a8ffcleanupAllTemporaryFilesTb4b4b4(Tb4b4b4)

T8b949e/** Delete a single firmware [file] from local storage. */
Tff7b72suspend Tff7b72fun Td2a8ffdeleteFileTb4b4b4(Te6edf3fileTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4)

T8b949e// ── Network ──────────────────────────────────────────────────────────

T8b949e/** Return `true` if [url] is reachable (HTTP HEAD check). */
Tff7b72suspend Tff7b72fun Td2a8ffcheckUrlExistsTb4b4b4(Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean

T8b949e/** Fetch the UTF-8 text body of [url], returning `null` on any HTTP or network error. */
Tff7b72suspend Tff7b72fun Td2a8fffetchTextTb4b4b4(Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String?

T8b949e/**
* Download a file from [url], saving it as [fileName] in a temporary directory.
*
* @param onProgress Progress callback (0.0 to 1.0).
* @return The downloaded [FirmwareArtifact], or `null` on failure.
*/
Tff7b72suspend Tff7b72fun Td2a8ffdownloadFileTb4b4b4(Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3onProgressTb4b4b4: Tb4b4b4(Tffa657FloatTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4)Tb4b4b4: Te6edf3FirmwareArtifact?

T8b949e// ── File I/O ─────────────────────────────────────────────────────────

T8b949e/** Return the size in bytes of the given firmware [file]. */
Tff7b72suspend Tff7b72fun Td2a8ffgetFileSizeTb4b4b4(Te6edf3fileTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4)Tb4b4b4: Tffa657Long

T8b949e/** Read the raw bytes of a [FirmwareArtifact]. */
Tff7b72suspend Tff7b72fun Td2a8ffreadBytesTb4b4b4(Te6edf3artifactTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4)Tb4b4b4: Te6edf3ByteArray

T8b949e/**
* Copy a platform URI into a temporary [FirmwareArtifact] so it can be read with [readBytes]. Returns `null` when
* the URI cannot be resolved.
*/
Tff7b72suspend Tff7b72fun Td2a8ffimportFromUriTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4)Tb4b4b4: Te6edf3FirmwareArtifact?

T8b949e/** Resolve a user-visible display filename for [uri], or `null` when the provider does not expose one. */
Tff7b72suspend Tff7b72fun Td2a8ffgetDisplayNameTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4)Tb4b4b4: Tffa657String?

T8b949e/** Copy [source] to the platform URI [destinationUri], returning the number of bytes written. */
Tff7b72suspend Tff7b72fun Td2a8ffcopyToUriTb4b4b4(Te6edf3sourceTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4, Te6edf3destinationUriTb4b4b4: Te6edf3CommonUriTb4b4b4)Tb4b4b4: Tffa657Long

T8b949e// ── Zip / extraction ─────────────────────────────────────────────────

T8b949e/**
* Extract a matching firmware binary from a platform URI (e.g. content:// or file://) zip archive.
*
* @param hardware Used to match the correct binary inside the zip.
* @param fileExtension The extension to filter for (e.g. ".bin", ".uf2").
* @param preferredFilename Optional exact filename to prefer within the zip.
* @return The extracted [FirmwareArtifact], or `null` if no matching file was found.
*/
Tff7b72suspend Tff7b72fun Td2a8ffextractFirmwareTb4b4b4(
Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4,
Te6edf3hardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4,
Te6edf3fileExtensionTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3preferredFilenameTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3FirmwareArtifact?

T8b949e/**
* Extract a matching firmware binary from a previously-downloaded zip [FirmwareArtifact].
*
* @param zipFile The zip archive to extract from.
* @param hardware Used to match the correct binary inside the zip.
* @param fileExtension The extension to filter for (e.g. ".bin", ".uf2").
* @param preferredFilename Optional exact filename to prefer within the zip.
* @return The extracted [FirmwareArtifact], or `null` if no matching file was found.
*/
Tff7b72suspend Tff7b72fun Td2a8ffextractFirmwareFromZipTb4b4b4(
Te6edf3zipFileTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4,
Te6edf3hardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4,
Te6edf3fileExtensionTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3preferredFilenameTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3FirmwareArtifact?

T8b949e/**
* Extract all entries from a zip [artifact] into a `Map<entryName, bytes>`. Used by the DFU handler to parse Nordic
* DFU packages.
*/
Tff7b72suspend Tff7b72fun Td2a8ffextractZipEntriesTb4b4b4(Te6edf3artifactTb4b4b4: Te6edf3FirmwareArtifactTb4b4b4)Tb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3ByteArrayTff7b72>
Tb4b4b4}

T8b949e/**
* Check whether [filename] is a valid firmware binary for [target] with the expected [fileExtension]. Excludes
* non-firmware binaries that share the same extension (e.g. `littlefs-*`, `bleota*`).
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffComplexConditionTa5d6ff"Tb4b4b4) T8b949e// excluded-binary + target/extension guards collapsed to one early-out
Tff7b72internal Tff7b72fun Td2a8ffisValidFirmwareFileTb4b4b4(Te6edf3filenameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3targetTb4b4b4: Tffa657StringTb4b4b4, Te6edf3fileExtensionTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6fflittlefs-Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffbleotaTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3filenameTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffmt-Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3filenameTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff.factory.Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3targetTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Tff7b72!Te6edf3filenameTb4b4b4.Te6edf3endsWithTb4b4b4(Te6edf3fileExtensionTb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72false
Tb4b4b4}

Tff7b72val Te6edf3targetToken Tff7b72= Te6edf3RegexTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3targetTb4b4b4)
Tff7b72val Te6edf3extensionToken Tff7b72= Te6edf3RegexTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3fileExtensionTb4b4b4)
T8b949e// What follows the target must be a dotted version (`-2.7.17`, `-v2.7.17`), the literal `firmware`, or the
T8b949e// extension itself. Accepting a bare digit here let digit-led sibling variants through β€” `tlora-v2` matched
T8b949e// `firmware-tlora-v2-1-1_6-2.7.14.bin`, which belongs to `tlora-v2-1-1_6` β€” and flashed the wrong variant.
Tff7b72val Te6edf3versionOrFirmware Tff7b72= Ta5d6ff"Ta5d6ff([Ta5d6ff\\Ta5d6ff-_]v?Ta5d6ff\\Ta5d6ffd+Ta5d6ff\\Ta5d6ff.Ta5d6ff\\Ta5d6ffd+|[Ta5d6ff\\Ta5d6ff-_.]firmware)Ta5d6ff"
Tff7b72val Te6edf3targetPattern Tff7b72= Te6edf3RegexTb4b4b4(Ta5d6ff"Ta5d6ff(^|.*[Ta5d6ff\\Ta5d6ff-_])Tffd700$Te6edf3targetTokenTa5d6ff(Tffd700$Te6edf3versionOrFirmwareTa5d6ff.*Tffd700$Te6edf3extensionToken$Ta5d6ff|Tffd700$Te6edf3extensionToken$Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3targetPatternTb4b4b4.Te6edf3matchesTb4b4b4(Te6edf3filenameTb4b4b4)
Tb4b4b4}

Tff7b72data Tff7b72class T56d364PendingLocalFirmwareFileTb4b4b4(
Tff7b72val Te6edf3uriTb4b4b4: Te6edf3CommonUriTb4b4b4,
Tff7b72val Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3deviceNameTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3platformioTargetTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3updateMethodTb4b4b4: Te6edf3FirmwareUpdateMethodTb4b4b4,
Tff7b72val Te6edf3addressTb4b4b4: Tffa657StringTb4b4b4,
Tb4b4b4)

T8b949e/** pioEnv-aware target: falls back to [DeviceHardware.hwModelSlug] when [DeviceHardware.platformioTarget] is unset. */
Tff7b72internal Tff7b72val Te6edf3DeviceHardwareTb4b4b4.Te6edf3effectiveTargetTb4b4b4: Tffa657String
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3platformioTargetTb4b4b4.Te6edf3ifEmpty Tb4b4b4{ Te6edf3hwModelSlug Tb4b4b4}

Tff7b72internal Tff7b72fun Td2a8ffvalidatePendingLocalFirmwareFileTb4b4b4(
Te6edf3pendingFileTb4b4b4: Te6edf3PendingLocalFirmwareFileTb4b4b4,
Te6edf3currentStateTb4b4b4: Te6edf3FirmwareUpdateStateTb4b4b4.Te6edf3ReadyTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3LocalFirmwareFileValidation Tb4b4b4{
Tff7b72val Te6edf3currentTarget Tff7b72= Te6edf3currentStateTb4b4b4.Te6edf3deviceHardwareTb4b4b4.Te6edf3effectiveTarget
Tff7b72return Tff7b72when Tb4b4b4{
T8b949e// The user selected the file under a different connection (method or address) than the
T8b949e// one active now β€” the file may still match the target, but the confirmation context is stale.
Te6edf3currentStateTb4b4b4.Te6edf3updateMethod Tff7b72!Tff7b72= Te6edf3pendingFileTb4b4b4.Te6edf3updateMethod Tff7b72|Tff7b72| Te6edf3currentStateTb4b4b4.Te6edf3address Tff7b72!Tff7b72= Te6edf3pendingFileTb4b4b4.Te6edf3address Tff7b72-Tff7b72>
Te6edf3LocalFirmwareFileValidationTb4b4b4.Te6edf3InvalidTb4b4b4(Te6edf3LocalFirmwareFileValidationReasonTb4b4b4.Te6edf3ConfirmationContextChangedTb4b4b4)

Te6edf3currentTarget Tff7b72!Tff7b72= Te6edf3pendingFileTb4b4b4.Te6edf3platformioTarget Tff7b72-Tff7b72>
Te6edf3LocalFirmwareFileValidationTb4b4b4.Te6edf3InvalidTb4b4b4(Te6edf3LocalFirmwareFileValidationReasonTb4b4b4.Te6edf3TargetMismatchTb4b4b4)

T8b949e// Context matches β€” revalidate the filename against the current method before flashing.
Tff7b72else Tff7b72-Tff7b72>
Te6edf3validateLocalFirmwareFileNameTb4b4b4(Te6edf3pendingFileTb4b4b4.Te6edf3fileNameTb4b4b4, Te6edf3currentStateTb4b4b4.Te6edf3deviceHardwareTb4b4b4, Te6edf3currentStateTb4b4b4.Te6edf3updateMethodTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffReturnCountTa5d6ff"Tb4b4b4) T8b949e// two guard-clause early returns + trailing when; refactor would harm clarity
Tff7b72internal Tff7b72fun Td2a8ffpreferredLocalFirmwareArchiveFilenamesTb4b4b4(
Te6edf3archiveFileNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3hardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4,
Te6edf3updateMethodTb4b4b4: Te6edf3FirmwareUpdateMethodTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72> Tb4b4b4{
Tff7b72val Te6edf3target Tff7b72= Te6edf3hardwareTb4b4b4.Te6edf3effectiveTargetTb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4} Tff7b72?: Tff7b72return Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3version Tff7b72= Te6edf3extractFirmwareVersionTb4b4b4(Te6edf3archiveFileNameTb4b4b4) Tff7b72?: Tff7b72return Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72when Tb4b4b4(Te6edf3updateMethodTb4b4b4) Tb4b4b4{
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Ble Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3hardwareTb4b4b4.Te6edf3isEsp32ArcTb4b4b4) Tb4b4b4{
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fffirmware-Tffd700$Te6edf3targetTa5d6ff-Tffd700$Te6edf3versionTa5d6ff-update.binTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffirmware-Tffd700$Te6edf3targetTa5d6ff-Tffd700$Te6edf3versionTa5d6ff.binTa5d6ff"Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fffirmware-Tffd700$Te6edf3targetTa5d6ff-Tffd700$Te6edf3versionTa5d6ff-ota.zipTa5d6ff"Tb4b4b4)
Tb4b4b4}

Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Wifi Tff7b72-Tff7b72> Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fffirmware-Tffd700$Te6edf3targetTa5d6ff-Tffd700$Te6edf3versionTa5d6ff-update.binTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffirmware-Tffd700$Te6edf3targetTa5d6ff-Tffd700$Te6edf3versionTa5d6ff.binTa5d6ff"Tb4b4b4)

Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Usb Tff7b72-Tff7b72> Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fffirmware-Tffd700$Te6edf3targetTa5d6ff-Tffd700$Te6edf3versionTa5d6ff.uf2Ta5d6ff"Tb4b4b4)

Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Unknown Tff7b72-Tff7b72> Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffextractFirmwareVersionTb4b4b4(Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String? Tb4b4b4{
Tff7b72val Te6edf3baseName Tff7b72= Te6edf3fileNameTb4b4b4.Te6edf3substringAfterLastTb4b4b4(Ta5d6ff'/'Tb4b4b4)Tb4b4b4.Te6edf3substringAfterLastTb4b4b4(Ta5d6ff'\\'Tb4b4b4)
Tff7b72return Te6edf3FIRMWARE_VERSION_PATTERNTb4b4b4.Te6edf3findTb4b4b4(Te6edf3baseNameTb4b4b4)Tff7b72?.Te6edf3groupValuesTff7b72?.Te6edf3getOrNullTb4b4b4(T79c0ff1Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72val Te6edf3FIRMWARE_VERSION_PATTERN Tff7b72= Te6edf3RegexTb4b4b4(Ta5d6ff"""Ta5d6ff(?:^|[-_])v?(Ta5d6ff\Ta5d6ffd+(?:Ta5d6ff\Ta5d6ff.[0-9A-Za-z]+)+)(?=(?:[-_][A-Za-z]+)?Ta5d6ff\Ta5d6ff.[^.]+$Ta5d6ff)Ta5d6ff"""Tb4b4b4)

Tff7b72internal Tff7b72sealed Tff7b72interface T56d364LocalFirmwareFileValidation Tb4b4b4{
Tff7b72data Tff7b72object T56d364Valid Tb4b4b4: Te6edf3LocalFirmwareFileValidation

Tff7b72data Tff7b72class T56d364InvalidTb4b4b4(Tff7b72val Te6edf3reasonTb4b4b4: Te6edf3LocalFirmwareFileValidationReasonTb4b4b4) Tb4b4b4: Te6edf3LocalFirmwareFileValidation
Tb4b4b4}

Tff7b72internal Tff7b72enum Tff7b72class T56d364LocalFirmwareFileValidationReason Tb4b4b4{
Te6edf3MissingTargetTb4b4b4,
Te6edf3MissingArchiveFirmwareTb4b4b4,
Te6edf3RequiresOtaZipTb4b4b4,
Te6edf3RequiresBinTb4b4b4,
Te6edf3RequiresUf2Tb4b4b4,
Te6edf3TargetMismatchTb4b4b4,
Te6edf3ConfirmationContextChangedTb4b4b4,
Te6edf3UnsupportedUpdateMethodTb4b4b4,
Tb4b4b4}

Tff7b72internal Tff7b72fun Td2a8ffvalidateLocalFirmwareFileNameTb4b4b4(
Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3hardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4,
Te6edf3updateMethodTb4b4b4: Te6edf3FirmwareUpdateMethodTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3LocalFirmwareFileValidation Tb4b4b4{
Tff7b72val Te6edf3normalizedFileName Tff7b72= Te6edf3fileNameTb4b4b4.Te6edf3substringAfterLastTb4b4b4(Ta5d6ff'/'Tb4b4b4)Tb4b4b4.Te6edf3substringAfterLastTb4b4b4(Ta5d6ff'\\'Tb4b4b4)Tb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3target Tff7b72= Te6edf3hardwareTb4b4b4.Te6edf3effectiveTargetTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3targetTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3LocalFirmwareFileValidationTb4b4b4.Te6edf3InvalidTb4b4b4(Te6edf3LocalFirmwareFileValidationReasonTb4b4b4.Te6edf3MissingTargetTb4b4b4)
Tb4b4b4}

Tff7b72return Tff7b72when Tb4b4b4(Te6edf3updateMethodTb4b4b4) Tb4b4b4{
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Ble Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3hardwareTb4b4b4.Te6edf3isEsp32ArcTb4b4b4) Tb4b4b4{
Te6edf3validateEsp32LocalFirmwareTb4b4b4(Te6edf3normalizedFileNameTb4b4b4, Te6edf3targetTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3validateNrf52LocalFirmwareTb4b4b4(Te6edf3normalizedFileNameTb4b4b4, Te6edf3targetTb4b4b4)
Tb4b4b4}

Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Wifi Tff7b72-Tff7b72> Te6edf3validateEsp32LocalFirmwareTb4b4b4(Te6edf3normalizedFileNameTb4b4b4, Te6edf3targetTb4b4b4)

Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Usb Tff7b72-Tff7b72> Te6edf3validateUsbLocalFirmwareTb4b4b4(Te6edf3normalizedFileNameTb4b4b4, Te6edf3targetTb4b4b4)

Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Unknown Tff7b72-Tff7b72>
Te6edf3LocalFirmwareFileValidationTb4b4b4.Te6edf3InvalidTb4b4b4(Te6edf3LocalFirmwareFileValidationReasonTb4b4b4.Te6edf3UnsupportedUpdateMethodTb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Returns the firmware payload file extension this platform's update handler expects to receive.
*
* nRF52 BLE consumes the Nordic DFU `.zip` package directly via [SecureDfuHandler]; ESP32 (BLE or WiFi) streams a raw
* `.bin`; USB copies a `.uf2` to the mass-storage drive. Returns `null` for [FirmwareUpdateMethod.Unknown], which does
* not support local files.
*/
Tff7b72internal Tff7b72fun Td2a8fflocalFirmwarePayloadExtensionTb4b4b4(Te6edf3hardwareTb4b4b4: Te6edf3DeviceHardwareTb4b4b4, Te6edf3updateMethodTb4b4b4: Te6edf3FirmwareUpdateMethodTb4b4b4)Tb4b4b4: Tffa657String? Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3updateMethodTb4b4b4) Tb4b4b4{
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Ble Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3hardwareTb4b4b4.Te6edf3isEsp32ArcTb4b4b4) Ta5d6ff"Ta5d6ff.binTa5d6ff" Tff7b72else Ta5d6ff"Ta5d6ff.zipTa5d6ff"
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Wifi Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ff.binTa5d6ff"
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Usb Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ff.uf2Ta5d6ff"
Te6edf3FirmwareUpdateMethodTb4b4b4.Te6edf3Unknown Tff7b72-Tff7b72> Tff7b72null
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffvalidateNrf52LocalFirmwareTb4b4b4(Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3targetTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3LocalFirmwareFileValidation Tff7b72=
Te6edf3validateSuffixedLocalFirmwareTb4b4b4(
Te6edf3fileName Tff7b72= Te6edf3fileNameTb4b4b4,
Te6edf3target Tff7b72= Te6edf3targetTb4b4b4,
Te6edf3requiredSuffix Tff7b72= Ta5d6ff"Ta5d6ff-ota.zipTa5d6ff"Tb4b4b4,
Te6edf3fileExtension Tff7b72= Ta5d6ff"Ta5d6ff.zipTa5d6ff"Tb4b4b4,
Te6edf3missingSuffixReason Tff7b72= Te6edf3LocalFirmwareFileValidationReasonTb4b4b4.Te6edf3RequiresOtaZipTb4b4b4,
Tb4b4b4)

Tff7b72private Tff7b72fun Td2a8ffvalidateEsp32LocalFirmwareTb4b4b4(Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3targetTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3LocalFirmwareFileValidation Tff7b72=
Te6edf3validateSuffixedLocalFirmwareTb4b4b4(
Te6edf3fileName Tff7b72= Te6edf3fileNameTb4b4b4,
Te6edf3target Tff7b72= Te6edf3targetTb4b4b4,
Te6edf3requiredSuffix Tff7b72= Ta5d6ff"Ta5d6ff.binTa5d6ff"Tb4b4b4,
Te6edf3fileExtension Tff7b72= Ta5d6ff"Ta5d6ff.binTa5d6ff"Tb4b4b4,
Te6edf3missingSuffixReason Tff7b72= Te6edf3LocalFirmwareFileValidationReasonTb4b4b4.Te6edf3RequiresBinTb4b4b4,
Tb4b4b4)

Tff7b72private Tff7b72fun Td2a8ffvalidateUsbLocalFirmwareTb4b4b4(Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3targetTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3LocalFirmwareFileValidation Tff7b72=
Te6edf3validateSuffixedLocalFirmwareTb4b4b4(
Te6edf3fileName Tff7b72= Te6edf3fileNameTb4b4b4,
Te6edf3target Tff7b72= Te6edf3targetTb4b4b4,
Te6edf3requiredSuffix Tff7b72= Ta5d6ff"Ta5d6ff.uf2Ta5d6ff"Tb4b4b4,
Te6edf3fileExtension Tff7b72= Ta5d6ff"Ta5d6ff.uf2Ta5d6ff"Tb4b4b4,
Te6edf3missingSuffixReason Tff7b72= Te6edf3LocalFirmwareFileValidationReasonTb4b4b4.Te6edf3RequiresUf2Tb4b4b4,
Tb4b4b4)

Tff7b72private Tff7b72fun Td2a8ffvalidateSuffixedLocalFirmwareTb4b4b4(
Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3targetTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3requiredSuffixTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3fileExtensionTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3missingSuffixReasonTb4b4b4: Te6edf3LocalFirmwareFileValidationReasonTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3LocalFirmwareFileValidation Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fileNameTb4b4b4.Te6edf3endsWithTb4b4b4(Te6edf3requiredSuffixTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3LocalFirmwareFileValidationTb4b4b4.Te6edf3InvalidTb4b4b4(Te6edf3missingSuffixReasonTb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3validateTargetMatchTb4b4b4(Te6edf3fileNameTb4b4b4, Te6edf3targetTb4b4b4, Te6edf3fileExtensionTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffvalidateTargetMatchTb4b4b4(Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3targetTb4b4b4: Tffa657StringTb4b4b4, Te6edf3fileExtensionTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3LocalFirmwareFileValidation Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isValidFirmwareFileTb4b4b4(Te6edf3fileNameTb4b4b4, Te6edf3targetTb4b4b4, Te6edf3fileExtensionTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LocalFirmwareFileValidationTb4b4b4.Te6edf3Valid
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3LocalFirmwareFileValidationTb4b4b4.Te6edf3InvalidTb4b4b4(Te6edf3LocalFirmwareFileValidationReasonTb4b4b4.Te6edf3TargetMismatchTb4b4b4)
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.08s